home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Telnet 2.7b5 / source / main / memory.c < prev    next >
Encoding:
Text File  |  1995-04-01  |  2.8 KB  |  136 lines  |  [TEXT/CWIE]

  1. //memory.c 
  2.  
  3. #include "memory.proto.h"
  4.  
  5. static Size gCushion;                /* size of memory cushion */
  6. static Size gReserve;                /* size of memory reserve */
  7. static Handle gReserveBlock = NULL;    /* reserve block */
  8. static Boolean gCritical = true;    /* true if current memory request is critical */
  9.  
  10. void initMemoryBuffer(Size cushion, Size reserve)
  11. {
  12.     OSErr err = noErr;
  13.     static GrowZoneUPP myGrowZoneUPP;
  14.  
  15.     gCushion = cushion;
  16.     gReserve = reserve;
  17.     gReserveBlock = NewHandle(reserve);
  18.     myGrowZoneUPP = NewGrowZoneProc(MyGrowZone);
  19.     SetGrowZone(myGrowZoneUPP);
  20.     return;
  21. }
  22.  
  23. Boolean RecoverReserveMemory (void)
  24. {
  25.     if (gReserveBlock == nil) return true;
  26.     if (*gReserveBlock != nil) return true;
  27.     ReallocateHandle(gReserveBlock, gReserve);
  28.     if (MemError() != noErr) return false;
  29.     return MemoryAvailable(0);
  30. }
  31.  
  32. Boolean MemoryAvailable (Size len)
  33. {
  34.     long total, contig;
  35.     
  36.     if (gReserveBlock == nil || *gReserveBlock == nil) {
  37.         if (!RecoverReserveMemory()) return false;
  38.     }
  39.     PurgeSpace(&total, &contig);
  40.     return len + gCushion < contig;
  41. }
  42.  
  43. static pascal long MyGrowZone (Size cbNeeded)
  44. {
  45.     long theA5, result;
  46.     
  47.     theA5 = SetCurrentA5();
  48.     if (gCritical && gReserveBlock != nil && 
  49.         *gReserveBlock != nil && gReserveBlock != GZSaveHnd()) 
  50.     {
  51.         EmptyHandle(gReserveBlock);
  52.         result = gReserve;
  53.     } else {
  54.         result = 0;
  55.     }
  56.     SetA5(theA5);
  57.     return result;
  58. }
  59.  
  60.  
  61. Handle myNewHandle(Size len)
  62. {
  63.     Handle tempHandle;
  64.     if (!MemoryAvailable(len)) return NULL;
  65.     gCritical = FALSE;
  66.     tempHandle = NewHandleClear(len);
  67.     gCritical = TRUE;
  68.     return tempHandle;
  69. }
  70.  
  71. Handle myNewHandleCritical(Size len)
  72. {
  73.     Handle tempHandle;
  74.     tempHandle = NewHandleClear(len);
  75.     return tempHandle;
  76. }
  77.  
  78.  
  79. Ptr myNewPtr(Size len)
  80. {
  81.     Ptr tempPtr;
  82.     if (!MemoryAvailable(len)) return NULL;
  83.     gCritical = FALSE;
  84.     tempPtr = NewPtrClear(len);
  85.     gCritical = TRUE;
  86.     return tempPtr;
  87. }
  88.  
  89. Ptr myNewPtrCritical(Size len)
  90. {
  91.     Ptr tempPtr;
  92.     tempPtr = NewPtrClear(len);
  93.     return tempPtr;
  94. }
  95.  
  96. OSErr mySetHandleSize (Handle handle, Size len)
  97. {
  98.     Size oldLen;
  99.     OSErr err = noErr;
  100.  
  101.     oldLen = GetHandleSize(handle);
  102.     if (oldLen < len) {
  103.         if (!MemoryAvailable(len-oldLen)) return memFullErr;
  104.     }
  105.     gCritical = FALSE;
  106.     SetHandleSize(handle, len);
  107.     gCritical = TRUE;
  108.     err = MemError();
  109.     if (err == memFullErr) {
  110.         /* The Memory Manager is too stupid to do this itself. */
  111.         MoveHHi(handle);
  112.         CompactMem(maxSize);
  113.         gCritical = FALSE;
  114.         SetHandleSize(handle, len);
  115.         gCritical = TRUE;
  116.         err = MemError();
  117.     }
  118.     if (err != noErr) return err;
  119.     if (oldLen >= len) return noErr;
  120.     if (MemoryAvailable(0)) return noErr;
  121.     SetHandleSize(handle, oldLen);
  122.     return memFullErr;
  123. }
  124.  
  125. OSErr MySetHandleSizeCritical (Handle handle, Size len)
  126. {
  127.     SetHandleSize(handle, len);
  128.     if (MemError() == memFullErr) {
  129.         /* The Memory Manager is too stupid to do this itself. */
  130.         MoveHHi(handle);
  131.         CompactMem(maxSize);
  132.         SetHandleSize(handle, len);
  133.     }
  134.     return MemError();
  135. }
  136.